<?php

include("Date.php");

class Mois {
  /**
   * Le mois en question
   */
  private $mois;

  /**
   * Le mois de cette ann�e ci
   */
  private $annee;

  /**
   * L'image qui repr�sente le mois, g�n�ralement d�termin� par un concours sur le forum
   */
  private $image;
  
  /**
   * Le decalage represente l'ecart entre le debut de la semaine et le debut du mois
   */
  private $decalage;
  
  /**
   * Mois suivant :
   */
  private $nextMonth;
  
  /**
   * Mois précédent
   */
  private $previousMonth;
  
  /**
   * Le constructeur de la classe :
   * @param $mois Doit être de la forme 'mmaaaa', si rien n'est remplit ou si le format n'est pas le bon
   * alors le mois par défaut est le mois courant
   * 
   * @return boolean Si c'était le mois demandé alors true, sinon (ou si mois courant) false
   */
  public function __construct($mois = false) {
  	global $db, $erreurs, $infos;

  	//Testons la forme de mois :
  	if($mois != false && strlen($mois) == 6 && checkdate(substr($mois, 0, 2), 1, substr($mois, 2, 4))) {
  		//Le mois est bien formé, donc :
  		$this->annee = substr($mois, 2, 4);
  		$this->mois = substr($mois, 0, 2);
  	} else {
	  	//Ah ben y'a pas ou mal formé, donc finalement ce sera ce mois ci :
  		$this->annee = date('Y');
  		$this->mois = date('m');
  	}

  	//On calcule le decalage (correspond au nombre de jour de la semaine avant le 1er du mois)
  	$tmp_date = mktime(0,0,0,$this->mois, 1, $this->annee);
  	$this->decalage  = date('N', $tmp_date) - 1;
  	
  	//Et maintenant on récupère l'image :
  	$moisSQL = "SELECT
  					m.image
  				FROM
  					" . CALENDRIER_MOIS_TABLE . " m
  				WHERE
  						m.mois = '".$this->mois."'
  					AND
  						m.annee = '".substr($this->annee,2, 2)."'";
  	$result = $db->sql_query($moisSQL);
  	$data = $db->sql_fetchrow($result);
  	$db->sql_freeresult($result);
	if(!$data['image'])
		$this->image = 'default.jpg';
	else
		$this->image = $data['image'];
  	
  	//On calcule le mois suivant :
  	$this->nextMonth = date('mY', mktime(0,0,0,$this->mois + 1, 1, $this->annee));
  	
  	//On calcule le mois precedent :
  	$this->previousMonth = date('mY', mktime(0,0,0,$this->mois - 1, 1, $this->annee));
  	//Et on dit merci à php de recalculer tout ça comme il faut !
  	
  	return false;
  }

  /**
   * Cette op�ration permet d'afficher un mois dans le template phpBB3
   * @param boolean $boucle par défaut à false, si jamais à true alors l'affichage se fera dans une boucle
   * @param boolean $afficheDate si cette option est à true alors alors on affiche aussi les dates dans le template
   */
  public function voir_mois($boucle = false, $afficheDate = false)
  {
  	global $template;

  	//Les infos du mois :
  	$infos_mois = array(
  		'MOIS' 				=> $this->mois,
  		'ANNEE'				=> $this->annee,
  		'IMAGE'				=> $this->image,
  		'DECALAGE'			=> $this->decalage,
  		'NEXT_MONTH'		=> $this->nextMonth,
  		'PREVIOUS_MONTH'	=> $this->previousMonth,
  		'MOIS_TEXT'			=> displayFrenchMonths($this->mois)
  	);
  	
  	//On affiche les infos du mois :
  	if($boucle)
  		$template->assign_block_vars('mois', $infos_mois);
  	else
  		$template->assign_vars($infos_mois);
  	
  	if($afficheDate) {
	  	(int) $jour = 1;
	  	
	  	//Pour chaque jour du mois on instancie un objet Date et on l'affiche :
	  	while(checkdate($this->mois, $jour, $this->annee)) {
	  		$tmpDate = new Date(mktime(0, 0, 0, $this->mois, $jour, $this->annee));
	  		if($boucle == true) 
	  			$tmpDate->voir_date(true, 'mois');
	  		else
	  			$tmpDate->voir_date(true);
	  		$jour++;
	  	}
  	}
  }

  /**
   * Permet d'attribuer une image au mois
   * @param string $image
   */
  public function ajouter_image($image)
  {
  	global $db, $infos, $erreurs;
  	
  	if(empty($image))
  		$erreurs[] = 'Aucune image n\'a &eacute;t&eacute; pr&eacute;cis&eacute;e.';
  	else {
	  	//Si jamais une image est déjà associée au mois, alors c'est plutôt un update qu'on doit faire
	  	$test = "SELECT
	  					COUNT(*) as nb
	  				FROM
	  					" . CALENDRIER_MOIS_TABLE . " m
	  				WHERE
	  						m.mois = '".$this->mois."'
	  					AND
	  						m.annee = '".$this->annee."'";
	  	$result = $db->sql_query($test);
	  	$data = $db->sql_fetchrow($result);
	  	$db->sql_freeresult($result);
	  	
	  	if($data['nb'] > 0)
	  		$this->editer_image($image);
	  	else {
		  	$insert = "INSERT INTO
		  					" . CALENDRIER_MOIS_TABLE . "
		  					(
		  						image
		  						, mois
		  						, annee
		  					)
		  				VALUES
		  					(
		  						'".$image."'
		  						, '".$this->mois."'
		  						, '".substr($this->annee,2, 2)."'
		  					)";
		  	$db->sql_query($insert);
		  	$infos[] = 'L\'image a bien &eacute;t&eacute; attribu&eacute;e &agrave; ce mois.';
	  	}
  	}
  }

  /**
   * Cette fonction permet de modifier l'imager associée au mois.
   * @param string $image
   */
  public function editer_image($image)
  {
  	global $db, $infos, $erreurs;
  	
  	if(empty($image))
  		$erreurs[] = 'Aucune image n\'a &eacute;t&eacute; pr&eacute;cis&eacute;e.';
  	else {
	  	$update = "UPDATE
	  						" . CALENDRIER_MOIS_TABLE . "
	  					SET
	  						image = '".$image."'
	  					WHERE
	  							mois = '".$this->mois."'
	  						AND
	  							annee = '".$this->annee."'
	  					";
	  	$db->sql_query($update);
	  	$infos[] = 'L\'image a bien &eacute;t&eacute; modifi&eacute;e pour ce mois.';
  	}
  }

  /**
   * Permet d'afficher une repr�sentation miniature du mois pour int�gration dans un site phpBB3
   */
  public function voir_mois_mini()
  {
  }
  
  /**
   * getNextMonth
   * @return string mois au format mmaaaa
   */
  public function getNextMonth() {
  	return $this->nextMonth;
  }
  
/**
   * getPreviousMonth
   * @return string mois au format mmaaaa
   */
  public function getPreviousMonth() {
  	return $this->previousMonth;
  }
}

/**
 * Permet d'avoir le nom des mois en français
 * @return string nom du mois
 */
function displayFrenchMonths($moisNb) {
	switch($moisNb) {
		case 1 :
			return "Janvier";
		case 2 :
			return "F&eacute;vrier";
		case 3 :
			return "Mars";
		case 4 :
			return "Avril";
		case 5 :
			return "Mai";
		case 6 :
			return "Juin";
		case 7 :
			return "Juillet";
		case 8 :
			return "Ao&ucirc;t";
		case 9 :
			return "Septembre";
		case 10 :
			return "Octobre";
		case 11 :
			return "Novembre";
		case 12 : 
			return "D&eacute;cembre";
		default :
			return "Filamembre";
	}
}
?>
